<?php

include_once 'Message.class.php';


/*
 *  La classe FormGeneral est une classe technique qui va intéragir avec tous les formulaires, 
 *  elle possède des méthodes pour vérifier si des champs ne sont pas vides, si une adresse mail est correcte, etc..
 *  elle peut aussi connecter, inscrire des utilisateurs, gérer l'ajout d'avis, gérer les modifications du 
 *  contenu du panier
 * 
 */



class FormGeneral{
    public static function lesChampsSontVides($array){
        $verif = false;
        foreach ($array as $v){
            $v = self::traiterChaine($v);
            if($v == "")
                $verif = true;
        }
        return $verif; 
    }
    
    
    public static function traiterChaine($string){
        return addslashes(htmlspecialchars(trim($string)));
    }
    
    public static function traiterList($array){
        foreach ($array as $v){
            $v = self::traiterChaine($v);
        }
        return $array;
    }
    
    public static function estUneAdresseMail($mail){
        $regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';
        return preg_match($regex_mail, $mail);
    }
    
    // renvoie un objet de la classe Message avec le statut à 1 si la vérification et l'ajout en base à été effectué, ou 0 si probleme avec un message
    public static function InscrireUser($array){
        $msg = new Message();
        $erreur = "";
        $array = self::traiterList($array);
        
        if(!self::lesChampsSontVides($array)){
            
            if($array['mdp'] == $array['mdp2']){
                
                if(self::estUneAdresseMail($array['email'])){
                    
                    $userDAO = new UserDAO();
                    if($userDAO->getUserByLogin($array['login']) == null){
                        
                        $v = array();
                        if($userDAO->ajouterUser(new User(0, $array['nom'], $array['prenom'], $array['login'], md5($array['mdp']), $array['email'], $array['dateNaissa'], 0, new Panier($v)))){
                            $msg->setStatut(1);
                            $erreur = "vous êtes inscrit et connecté !";
                        }
                        else
                            $erreur = "probleme ajout";
                            
                    }
                    else{
                        $erreur = "ce login est déja utilisé";
                    }
                }
                else{
                    $erreur = "l'adresse email n'est pas valide";
                }
            }
            else{
                $erreur = "les mots de passe ne correspondent pas ";
            }
        }
        else{
            $erreur = "les champs sont vides";
        }
        $msg->setMessage($erreur);
        return $msg;
    }
    
    
    // renvoie un objet de la classe Message avec le statut à 1 et un objet user si login et mdp correspondent en base, sinon user a null, statut à 0, et message
    public static function connecterUser($login, $mdp, $session) {
        $login = self::traiterChaine($login);
        $mdp = md5(self::traiterChaine($mdp));

        $erreur = "";
        $userDAO = new UserDAO();
        $msgConnect = new Message();

        if ($login != "" || $mdp != "") {
            $userBase = $userDAO->getUserByLogin($login);
            if(!is_null($userBase)){
                if($mdp == $userBase->getMdp()){
                    
                    if(isset($session['userAnonyme'])){
                        $userAnonyme = unserialize($session['userAnonyme']);
                        $panier = $userAnonyme->getPanier();
                        foreach ($panier->getLesProduitPanier() as $produitPanier) {
                            $userBase->getPanier()->ajouterDansLesProduitsPanier($produitPanier);
                        }
                        $userBase->getPanier()->calculPrixTotal();
                    }
                    
                    
                    $msgConnect->setStatut(1);
                    $msgConnect->setUserBase($userBase);
                    $erreur = "Vous êtes connecté";
                }
                else{
                    $erreur = "login ou mot de passe incorrect";
                }
            } 
            else {
                $erreur = "login ou mot de passe incorrect";
            }
        } 
        else {
            $erreur = "les champs sont vides";
        }
        
        $msgConnect->setMessage($erreur);
        return $msgConnect;
    }
    // renvoie un objet de la classe Message avec le statut à 1 et une collection d'avis si ok, sinon user a null, statut à 0, et message d'erreur
    public static function ajouterAvisSurProduit($array, $user, $idProduit){
        $erreur = "";
        $avisDAO = new AvisDAO();
        $produitDAO = new ProduitDAO();
        $msgAjout = new Message();
        
        $comment = self::traiterChaine($array['commentaireAvis']);
        $note = $array['noteAvis'];
        if($comment != "" && $note != ""){
            
            $note = intval($array['noteAvis']);
            if($note >= 0 && $note <= 5){
                if(!$avisDAO->aDejaDonneSonAvis($user->getId(), $idProduit)){
                    
                    
                    $pdt = $produitDAO->getProduitById($idProduit);
                    if($avisDAO->ajouterAvis(new Avis(null, null, null, $note, $comment, $user, 0,  $pdt))){
                        $erreur = "l'avis a été ajouté avec succès";
                        // on remet à jour les avis
                        $msgAjout->setLesAvis($avisDAO->getLesAvisByIdProduit($idProduit));
                        $msgAjout->setStatut(1);
                    }
                    else{
                        $erreur = "probleme d'ajout de l'avis";
                    }
                }
                else{
                    $erreur = "Vous avez déjà donné votre avis sur ce produit";
                }
            }
            else{
                $erreur = "la note va de 0 à 5";
            }
        }
        else{
            $erreur = "les champs sont vides";
        }
        $msgAjout->setMessage($erreur);
        return $msgAjout;
    }
    
    // renvoie un objet de la classe Message avec le statut à 1 et message si le mot de passe à été changé en base, sinon message d'erreur
    public static function changerMdp(User $user, $array){
        $erreur = "";
        $msgChange = new Message();
        $userDAO = new UserDAO();
        
        if(!self::lesChampsSontVides($array)){
            $array = self::traiterList($array);
            $userBase = $userDAO->getUserById($user->getId());
            if(md5($array['oldmdp']) == $userBase->getMdp()){
                if($array['newMdp'] == $array['newMdp2']){
                    $user->setMdp(md5($array['newMdp']));
                    if($userDAO->modifierUser($user)){
                        $msgChange->setStatut(1);
                        $msgChange->setUserBase($user);
                        $erreur =  "votre mot de passe a été changé";
                    }
                }
                else{
                    $erreur =  "les mot de passe ne correspondent pas";
                }
            }
            else{
                $erreur =  "l'ancien mot de passe ne correspond pas";
            }
        }
        else{
            $erreur =  "les champs sont vides";
            
        }
        $msgChange->setMessage($erreur);
        return $msgChange;
        
    }
    
     // renvoie un objet de la classe Message avec le statut à 1, message, et user si les coordonnées ont été changé en base, sinon message d'erreur
    public static function changerCoordUser(User $user, $array){
        $erreur = "";
        $msgChangeCoord = new Message();
        $userDAO = new UserDAO();
        
        if(!self::lesChampsSontVides($array)){
             $array = self::traiterList($array);
            if(self::estUneAdresseMail($array['newEmail'])){
                
                $userBase = $userDAO->getUserByLogin($array['newLogin']);
                if($userBase == null || $userBase->getLogin() == $user->getLogin()){
                    $user->setNom($array['newNom']);
                    $user->setPrenom($array['newPrenom']);
                    $user->setLogin($array['newLogin']);
                    $user->setEmail($array['newEmail']);
                    $user->setDateNaissance($array['newDateNaissance']);
                    if($userDAO->modifierUser($user)){
                        $msgChangeCoord->setStatut(1);
                        $msgChangeCoord->setUserBase($user);
                        $erreur = "modification effectuée";
                    }
                    else{
                        $erreur = "rien n'a été changé";
                    }
                }
                else{
                    $erreur = "ce login est déja utilisé";
                }
            }
            else{
                $erreur = "l'adresse email n'est pas valide";
            }
        }
        else{
            $erreur =  "les champs sont vides";
            
        }
        $msgChangeCoord->setMessage($erreur);
        return $msgChangeCoord;
    }
    
    // renvoie un objet de type Message avec le user et son panier modifié, si le produit n'est pas déjà dans son panier, sinon on augment la quantité
    public static function ajouterAuPanier($idProduit, $user){
        $produitDAO = new ProduitDAO();
        $msgAjouterPanier = new Message();
        $err = "";
        
        $produit = $produitDAO->getProduitById($idProduit);
        $produitPanier = new ProduitPanier($produit, 1);
            
            if($produit != null){
                if($user->getPanier()->estDejaDansLePanier($idProduit)){
                    $user->getPanier()->ajouterQteSurProduitPanier(1, $idProduit);
                    $err = "Ce produit est déjà dans votre panier mais sa quantité à été augmentée";
                    
                }
                else{
                    $err = "produit ajouté au panier";
                    $user->getPanier()->ajouterDansLesProduitsPanier($produitPanier);
                    
                }
                $user->getPanier()->calculPrixTotal();
                $msgAjouterPanier->setUserBase($user);
                $msgAjouterPanier->setStatut(1);

            }
            else{
                $err = "le produit n'existe pas ";

            }
        
        
        
        $msgAjouterPanier->setMessage($err);
        return $msgAjouterPanier;
        
    }
    
   
    // cette méthode permet de rafraichir les variable de session après des modifications faites  coté client en JS
    public static function rafraichirPanier($array, $user){
       $msgRefresh = new Message();
       $err = "";
       $stat = 0;
        array_pop($array);
        $lesProduitsPaniers = $user->GetPanier()->getLesProduitPanier();
        
        foreach ($array as $key => $qte){
            
            $index = substr($key, 13);
            $qte = intval($qte);
            $produitsPanier = $lesProduitsPaniers[$index];
            if($produitsPanier->getProduitPanier()->getStock() >= $qte && $qte > 0){
                $produitsPanier->setQuantiteProduit($qte);
                $err = "panier rafraichit";
                $stat = 1;
            }
            else{
                $err = "la quantite demandée est supérieure à celle en stock";
            }
        }
        $user->GetPanier()->setLesProduitPanier($lesProduitsPaniers);
        $msgRefresh->setMessage($err);
        $msgRefresh->setStatut($stat);
        $msgRefresh->setUserBase($user);
        return $msgRefresh;
    }
    
    // cette méthode prend le panier du user, enlève les produits demandés et retourne le user avec son nouveau panier
    public static function enleverArticleDuPanier($array, $user){
        $cpt = 0;
        $lesProduitsPaniers = $user->GetPanier()->getLesProduitPanier();   
        
        foreach ($array as $key => $sup){
            if(isset($array["supp_index_$cpt"])){
                unset($lesProduitsPaniers[$cpt]);
            }
            $cpt++;
        }
        $lesProduitsPaniers = array_values($lesProduitsPaniers);
        $user->GetPanier()->setLesProduitPanier($lesProduitsPaniers);
        $user->getPanier()->calculPrixTotal();
        return $user;
    }
    
    // permet d'enregistrer en base le panier d'utilisateur car le panier utilise des variables de sessions
    public static function SauvegarderPanier($panier, $user){
        $userDAO = new UserDAO();    
        $msgSave = new Message();
        $err = "";
        
       if($userDAO->sauvegarderPanierUser($panier, $user->getId())){
           $err = "panier sauvegardé";
       }
       else{
           $err = "panier déjà sauvegardé";
       }
       $msgSave->setStatut(1);
       
       $msgSave->setMessage($err);
       return $msgSave;
       
       
        
    }

}

?>
